본문으로 건너뛰기

week 2. 자료구조와 알고리즘, 운영체제

작성일: 2025-03-15

banner.webp

1. 강의 진도표

CS (3/10~3/14)

Day 6 프로세스 동기화

  • 알고리즘 Section 3 (1)
  • 운영체제 Section 4

Day 7 데드락

  • 알고리즘 Section 3 (2)
  • 운영체제 Section 5

Day 8 데드락

  • 알고리즘 Section 3 (3)
  • 운영체제 Section 6

Day 9 메모리

  • 알고리즘 Section 3 (4~5)
  • 운영체제 Section 7

Day 10 중간 점검

  • 온라인 세션

2. 운영체제 week 2

1. 프로세스 동기화

프로세스 간 통신 방법

  1. 프로세스는 파일과 운영체제가 생성한 파이프를 이용해 컴퓨터 내부에서 실행되는 다른 프로세스와 통신 가능합니다.

  2. 네트워크로 연결된 다른 컴퓨터에 있는 프로세스와 통신 가능합니다.(소켓통신, RPC)

  3. 한 프로세스 내부에서 쓰레드의 전역변수와 힙을 이용해 통신할 수 있습니다.

공유자원과 임계구역

  • 공유자원 : 프로세스 통신시 공동으로 이용하는 변수 또는 파일을 뜻합니다. 프로세스의 접근 순서에 따라 결과값이 달라질 수 있습니다.

  • 임계구역 : 프로세스 동시 사용시 동기화 문제가 일어날 수 있는데 이를 방지하기 위해 상호배제 메커니즘을 사용해 둘 이상의 프로세스가 접근하지 못하게 막는 기법입니다.

세마포어

상호배제 메커니즘의 한 가지로, 공유자원 사용시 운영체제가 프로세스를 대기시켜 하나의 프로세스만 사용할 수 있게 만드는 기법입니다.

모니터

운영체제가 아닌 프로그래밍 언어로 프로세스를 제어하는 방식으로 함수를 호출해 상호배제를 실현시킵니다.


2. 데드락

여러 프로세스가 공유자원 사용시, 하나의 프로세스의 작업이 끝나길 기다리는 도중 어떤 프로세스도 작업하지 못하는 교착상태 현상을 일컫습니다.

해결방안

  • 교착상태 회피 : 운영체제에서 각 프로세스가 현재 요구할 수 있는 예상 자원을 도출하고 시스템 총 자원량에서 할당하는 방식입니다.

  • 교착상태 해결 : 자원할당 그래프를 사용해 프로세스에서 교착상태 발생시, 프로세스를 강제종료 시키고 체크포인트로 롤백시키는 방식입니다.


3. 메모리

메모리 종류

  • 레지스터 : CPU 내부에 있는 고속 저장 장치로 연산을 처리할 때 사용되며, 매우 빠르고 적은 용량을 수용합니다.

  • 캐시 : CPU와 메모리 사이에 위치하여, 자주 사용되는 데이터를 임시로 저장하여 CPU가 빠르게 접근할 수 있도록 도와줍니다.

  • 메인메모리 : 실제 운영체제와 다른 프로세스들이 올라가는 공간으로, 실행중인 프로그램만 올립니다.

  • HDD,SSD : 전원이 공급되지 않아도 데이터가 지워지지 않는 비휘발성 메모리입니다. 속도가 느린 대신 많은 용량을 수용할 수 있습니다.

메모리와 주소

멀티 프로그밍 환경에서 여러 프로세스가 할당된 메모리를 관리하기 위해 주소를 지정해 관리합니다.

  • 물리 주소 공간(절대 주소) : 메모리를 컴퓨터에 연결하면 0x0 번지부터 시작하는 공간입니다. 실제 프로세스가 할당된 주소를 뜻합니다.

  • 논리 주소 공간(상대 주소) : 사용자 관점에서 바라본 주소 공간으로 CPU에게 명령시 사용하는 주소의 이름입니다.

메모리 할당방식

  • 가변 분할 방식 : 연속 메모리 할당이라고도 불리며, 프로세스의 크기에 따라 메모리를 나누는 방식입니다. 남는 메모리 공간 없이 사용 가능합니다. 공간 할당시 크기가 맞지 않는 메모리를 사용할 수 없어 많은 공간의 메모리가 낭비될 수 있습니다.

  • 고정 분할 방식 : 비연속 메모리 할당이라고도 불리며, 프로세스의 크기와 상관없이 메모리를 정해진 크기로 나누는 방식입니다. 구현이 간단하고 오버헤드가 적어지지만, 남는 메모리 공간이 생길 수 있습니다.

  • 버디 시스템 : 두 분할 방식을 혼합한 것으로 총 메모리를 2의 승수로 메모리를 분할해 할당하는 방식으로 가변 분할 방식을 사용하면서도 낭비하는 공간이 적어집니다.


3. 운영체제 과제 week 2

FIFO 스케줄링의 장단점이 뭔가요?

단순하고 직관적이지만 먼저 들어온 프로세스가 완전히 끝나야 다음 프로세스가 실행되기 때문에 작업 순서에 따라 대기 시간이 달라집니다.

SJF를 사용하기 여러운 이유가 뭔가요?

짧은 작업을 먼저 실행시키기 위한 방법이지만 프로세스 종료 시간은 예측하기 어렵고 처리시간이 긴 프로세스는 짧은 프로세스가 모두 실행될 때까지 기다려야 하기 때문입니다.

RR 스케줄링에서 타임 슬라이스가 아주 작으면 어떤 문제가 발생할까요?

프로세스에 작업 시간을 할당해 시간을 초과하면 강제로 다른 프로세스가 작업하도록 하는 방식으로(컨텍스트 스위칭), 너무 작게 할당하면 컨텍스트 스위칭 처리량이 많아져 오버헤드가 커지게 됩니다.

운영체제가 MLFQ에서 CPU Bound Process와 I/O Bound Process를 어떻게 구분할까요?

최적의 타입슬라이스를 설정해 실행시키는 방식으로, 작업 시간 할당량을 초과해 CPU 스케쥴러에게 강제로 뺏기는 조건으로 구분합니다. CPU 사용량이 많으면 CPU Bound Process 입니다.

공유자원이란무엇인가요?

프로세스 통신시 공동으로 이용하는 변수 또는 파일을 뜻합니다. 프로세스의 접근 순서에 따라 결과값이 달라질 수 있습니다.

교착상태에 빠질 수 있는 조건은 어떤 것들을 충족해야할까요?

여러 프로세스가 하나의 공유자원을 사용해야하는 상황이 발생하야 합니다. 상호 배제, 점유와 대기, 비선점, 순환 대기의 조건을 만족하면 데드락이 발생할 수 있습니다.


4. 알고리즘 week 2

1. 재귀

function factorial(number) {
if(number == 1 || number == 0){
return 1;
} else{
return number * factorial(number - 1);
}
}

어떠한 것을 정의할 때 자기 자신을 참조합니다. 특정 상황에서 종료하는 탈출 조건이 필요합니다.


2. 재귀 - 히노이 탑

특정 조건에 맞지 않으면 다른 함수를 호출하는 형태로 스택에 순서대로 쌓인 순서대로 프로세스를 실행할 수 있는 예제입니다.

3. 정렬 - 버블 정렬(시간 복잡도: O(n²))

배열에서 인접한 두 원소를 비교하여 크기가 잘못된 순서라면 교환하고, 이러한 과정을 배열의 끝까지 반복하면서 점차적으로 큰 값(또는 작은 값)을 끝으로 밀어내는 방식입니다.

4. 정렬 - 선택 정렬(시간 복잡도: O(n²))

배열에서 가장 작은(또는 큰) 원소를 찾아서 배열의 맨 앞에 위치시키는 방식으로 정렬을 진행하는 알고리즘입니다.


4. 알고리즘 과제 week 2

재귀함수에서 기저조건을 만들지 않거나 잘못 설정했을 때 어떤 문제가 발생할 수 있나요?

함수가 종료되지 않고 무한히 자기 자신을 호출하거나, 콜스텍이라는 메모리 공간이 가득차서 자동으로 종료(스택 오버플로우)될때까지 실행됩니다.

0부터 입력 n까지 홀수의 합을 더하는 재귀 함수를 만들어보세요.

function sumOdd(n) {
if (n < 1) {
return 0;
}
if (n % 2 !== 0) {
return n + sumOdd(n - 2);
} else {
return sumOdd(n - 1);
}
}

console.log(sumOdd(10)) // 25

다음 코드는 매개변수로 주어진 파일 경로(.는 현재 디렉토리)에 있는 하위 모든 파일과 디렉토리를 출력하는 코드입니다. 다음 코드를 재귀 함수를 이용하는 코드로 변경해보세요.

const fs = require("fs"); // 파일을 이용하는 모듈
const path = require("path"); // 폴더와 파일의 경로를 지정해주는 모듈

function traverseDirectory1(directory){
const stack = [directory]; // 순회해야 할 디렉토리를 저장할 스택

while (stack.length > 0) { // 스택이 빌 때까지 반복
const currentDir = stack.pop(); // 현재 디렉토리
const files = fs.readdirSync(currentDir); // 인자로 주어진 경로의 디렉토리에 있는 파일or디렉토리들

for (const file of files) { // 현재 디렉토리의 모든 파일or디렉토리 순회
const filePath = path.join(currentDir, file); //directory와 file을 하나의 경로로 합쳐줌
const fileStatus= fs.statSync(filePath); // 파일정보 얻기

if (fileStatus.isDirectory()) { // 해당 파일이 디렉토리라면
console.log('디렉토리:', filePath);
stack.push(filePath);
} else { // 해당 파일이 파일이라면
console.log('파일:', filePath);
}
}
}
}

traverseDirectory1("."); // 현재 경로의 모든 하위 경로의 파일, 디렉토리 출력
function traverseDirectory1(directory) {
const files = fs.readdirSync(directory);


// for (const file of files) {
// const filePath = path.join(currentDir, file);
// const fileStatus= fs.statSync(filePath);
//
// if (fileStatus.isDirectory()) {
// console.log('디렉토리:', filePath);
// stack.push(filePath);
// } else {
// console.log('파일:', filePath);
// }

for (const file of files) {
const filePath = path.join(directory, file);
const fileStatus = fs.statSync(filePath);

if (fileStatus.isDirectory()) {
console.log('디렉토리:', filePath);
traverseDirectory(filePath);
} else {
console.log('파일:', filePath);
}
}
}

5. 중간 점검

01.webp 02.webp

  • 자주 사용되는 패턴과 프로그램에서 사용하는 알고리즘을 예를 들어 이해를 돕는 형식의 내용이고, 이후 Q&A를 통해 다른 참가자들이 궁금해하는 내용을 답변해주셨습니다.

후기

펼치기

Liked : 좋았던 점은 무엇인가?

  • 이해하기 쉬운 강의
    • 비전공자도 쉽게 이해할 수 있는 방식으로 강의를 진행해 속성으로 배우기 편한 강의입니다.

Lacked : 아쉬웠던 점, 부족한 점은 무엇인가?

  • 단편적으로 알고 있음
    • 컴퓨터 지식을 알고 있다고 해도 여전히 템플릿을 사용해 프로덕트를 제작하는 것이 편하기 때문에 동작 원리만 이해하고 있습니다.

Learned : 배운 점은 무엇인가? (깨달은것, 인사이트, 기억하고 싶은 것 등)

  • 문제에 운영체제 지식 적용
    • 평소 문제를 해결할 때 동작하는 기능을 만들기 위해 코드를 작성했는데, 이 코드가 어떤 방식으로 실행되며, 왜 그렇게 만들어야 했는지 깨닫게 되었다.

Longed for : 앞으로 바라는 것은 무엇인가? (앞으로 어떤 행동을 할것인지)

  • 자주 복습하기
    • 스택과 메모리는 프로덕트를 생산하는 과정에서 매우 중요하게 작용하기 때문에 잊지 않기 위해 시간이 날 때마다 복습이 필요합니다.